package com.jt.service.impl;

import com.jt.service.FileService;
import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    /*接受用户信息保存到磁盘中
    * 定义返回时的协议和域名供浏览器浏览*/
    private String localDir = "E:/images"; //Windows系统
    //private String localDir = "/usr/local/src/images";//Linux系统
    private String urlPath = "http://image.jt.com";
    @Override
    public ImageVO upload(MultipartFile file) {
        //xxxxxx.jpg|png|gif 防止大小写问题,将所有字母转化为小写
        String fileName = file.getOriginalFilename().toLowerCase();
        //利用正则判断是否为图片
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
            //如果校验不通过,则终止程序
            return null;
        }
        System.out.println("图片类型正确的!!!!!!");
        //第二步 防止恶意程序 判断图片是否有宽度和高度
        //高级API ImageIO
        try {
            //以字节流的形式读取照片
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width == 0 || height == 0){//有真则真
                return null;
            }
            System.out.println("用户上传的是图片！");
            //第三步: 目录如何划分 yyyy/MM/dd
            // 通过日期的形式 可以划分目录 用户当天上传的日期
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //拼接目录 E:/images + /2022/11/11/  拼接目录
            String dirPath = localDir + dateDir;
            File dirFile = new File(dirPath);
            if(!dirFile.exists()){
                //不存在创建多级目录
                // 日期的作用可以分成多级目录
                dirFile.mkdirs();
            }
            //第四步: 使用uuid实现文件名称 uuid.jpg
            //uuid格式xx-xx-xx.jpg 将 - 替换成空串
            String uuid = UUID.randomUUID()
                    .toString().replace("-", "");
            //截取文件类型
            int index = fileName.lastIndexOf(".");
            String fileType = fileName.substring(index);// .jpg
            //生成新的文件名
            String newFile = uuid + fileType;
            //第五步:实现文件上传  全路径 再上传
            // E:/images/2021/10/15/uuid.jpg
            String path = dirPath + newFile;
            file.transferTo(new File(path));
            System.out.println("文件上传成功！");
            //虚拟路径只写动态变化的数据  /2021/11/11/uuid.jpg
            String virtualPath = dateDir + newFile;
            //真实图片名称
            String fileNameVO = newFile;
            //网络地址 http://image.jt.com/xx/uuid.jpg
            String url = urlPath + virtualPath;
            return new ImageVO(virtualPath,url,fileNameVO);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

    }

    @Override
    public void deleteFile(String virtualPath) {
        String path = localDir + virtualPath;
        File file = new File(path);
        if(file.exists()){
            file.delete();
        }
    }
}
